#include<iostream>
using namespace std;
struct producto
{
	string codigo;
	string descripcion;
	double precio;
	int cantidadDisponible;
};
int pedirOpcion ();
int comprobarCodigo (string codigo, struct producto vec[],int buscacodigo);
int ingresarProducto (struct producto vec[], int &cant);
void mostrarProducto (struct producto vec[], int cant);
void modificarProducto (struct producto vec[], int posicion);
int buscarProducto (struct producto vec[],int cant, string codigo);
int comprobarCantidad (struct producto vec[],int posicion, int venta);
int mayorPrecio (struct producto vec[], int cant, int &contador);
void noDisponibles (struct producto vec[], int cant);
void ordenarProductos (struct producto vec[] , int cant);
int main()
{
    struct producto vec[100];
    int cant = 0;
    int posicion, opcion;
    string codigo;
    int venta, aux;
    int contador;
    cout<<"Bienvenido"<<endl<<endl;
    opcion=pedirOpcion();
    while (opcion != 10)
    {
        switch (opcion)
        {
            case 1:
                    cant = ingresarProducto(vec, cant);
                    break;
            case 2:
                    mostrarProducto(vec, cant);
                    break;
            case 3:
                    cout<<endl<<endl<<"Ingrese el codigo del producto que desea buscar: ";
                    cin>>codigo;
                    posicion = buscarProducto(vec, cant,codigo);
                    modificarProducto(vec,posicion);
                    cout<<"Su producto ya se ha modificado";
                    break;
            case 4:
                    cout<<endl<<endl<<"Ingrese el codigo del producto que desea buscar: ";
                    cin>>codigo;
                    posicion = buscarProducto (vec,cant, codigo);
                    if (posicion==cant)
                    {
                        cout<<endl<<"Codigo no encontrado"<<endl;
                    }
                    else
                    {
                        cout<<endl<<"Descripcion: "<<vec[posicion].descripcion<<endl;
                        cout<<"Precio: "<<vec[posicion].precio<<endl;
                        cout<<"Cantidad disponible: "<<vec[posicion].cantidadDisponible<<endl;
                    }
                    break;
            case 5:
                    cout<<endl<<"Ingrese el codigo del producto: ";
                    cin>>codigo;
                    posicion = buscarProducto(vec,cant, codigo);
                    cout<<endl<<"Ingrese la cantidad a vender: ";
                    cin>>venta;
                    aux = comprobarCantidad(vec,posicion, venta);
                    if (aux==1)
                    {
                        cout<<"El precio total de la transaccion es: "<<vec[posicion].precio*venta;
                        vec[posicion].cantidadDisponible=vec[posicion].cantidadDisponible - venta;
                        cout<<endl<<endl;
                    }
                    else
                        cout<<"Error"<<endl<<"Cantidad no disponible"<<endl<<endl;
                    break;
            case 6:
                    posicion = mayorPrecio (vec, cant,contador);
                    if (contador == 1)
                    {
                        cout<<endl<<"Codigo: "<<vec[posicion].codigo<<endl;
                        cout<<"Descripcion: "<<vec[posicion].descripcion<<endl;
                        cout<<"Precio: "<<vec[posicion].precio<<endl;
                        cout<<"Cantidad disponible: "<<vec[posicion].cantidadDisponible<<endl<<endl;
                    }
                    else
                        cout<<"Error"<<endl<<"Mas de un producto encontrados"<<endl<<endl;
                    break;
            case 7:
                    noDisponibles (vec,cant);
                    break;
            case 8:
                    ordenarProductos (vec,cant);
                    cout<<endl<<"Los productos ya han sido modificados"<<endl<<endl;
                    break;
        }
        opcion=pedirOpcion();
    }
}
int pedirOpcion()
{
    int opcion;
    int flag=1;
    cout<<"Menu:"<<endl<<endl<<endl<<"1.Agregar producto"<<endl<<endl<<"2.Mostrar producto";
    cout<<endl<<endl<<"3.Modificar producto"<<endl<<endl<<"4.Buscar producto por codigo"<<endl<<endl;
    cout<<"5.Vender Producto"<<endl<<endl<<"6.Producto mas caro"<<endl<<endl<<"7.Productos no disponibles";
    cout<<endl<<endl<<"8.Ordenar productos por precio"<<endl<<endl<<"9.Salir"<<endl<<endl<<endl;
    while (flag != 0)
    {
        cout<<"Ingrese una opcion: ";
        cin>>opcion;
        if (opcion<10 && opcion>0)
            flag = 0;
        else
            cout<<"Error"<<endl<<"Por favor ingrese un numero del 1 al 9";
    }
    return opcion;
}
int ingresarProducto (struct producto vec[], int &cant)
{

    int buscacodigo;
    int retorno;
    int flag;
    flag = 1;
    if (cant<100)
    {
        cout<<endl<<"Ingrese el producto (maximo 100 productos)"<<endl<<endl<<"Codigo: ";
        while (flag != 0)
        {
            cin>>vec[cant].codigo;
            buscacodigo = cant;
            if (cant!=0)
            {
                retorno = comprobarCodigo (vec[cant].codigo,vec,buscacodigo);
                if (retorno == 0)
                    flag = 0;
                else
                    cout<<"Error"<<endl<<"Ingrese de nuevo un codigo: ";
            }
            if (cant == 0)
                flag=0;
        }
        cout<<endl<<"Descripcion: ";
        cin>>vec[cant].descripcion;
        cout<<endl<<"Precio: ";
        cin>>vec[cant].precio;
        cout<<endl<<"Cantidad de productos disponibles: ";
        cin>>vec[cant].cantidadDisponible;
        cout<<endl<<endl;
    }
    else
    {
        cout<<"Error"<<endl<<"Limite de productos excedido";
        cout<<endl;
    }
    cant++;
    return cant;
}
int comprobarCodigo (string codigo, struct producto vec[],int buscacodigo)
{
    int i,retornado;
    for (i=0;i!=buscacodigo;i++)
    {
        if (vec[i].codigo==codigo)
        {
            retornado = 1;
            break;
        }
        else
            retornado = 0;
    }
    return retornado;
}
void mostrarProducto (struct producto vec[], int cant)
{
    int i;
    for (i=0;i<cant;i++)
    {
        cout<<endl<<"Producto "<<i+1<<" : "<<endl<<endl;
        cout<<"Codigo: "<<vec[i].codigo<<endl;
        cout<<"Descripcion: "<<vec[i].descripcion<<endl;
        cout<<"Precio: "<<vec[i].precio<<endl;
        cout<<"Cantidad disponible: "<<vec[i].cantidadDisponible<<endl<<endl<<endl;
    }
    return;
}
void modificarProducto (struct producto vec[], int posicion)
{
    cout<<endl<<"Ingrese la nueva descripcion: ";
    cin>>vec[posicion].descripcion;
    cout<<"Ingrese el nuevo precio: ";
    cin>>vec[posicion].precio;
    cout<<"Ingrese la cantidad disponible: ";
    cin>>vec[posicion].cantidadDisponible;
    return;
}
int buscarProducto (struct producto vec[],int cant, string codigo)
{
    int i;
    for (i=0;i<cant;i++)
    {
        if (vec[i].codigo==codigo)
            break;
    }
    return i;
}
int comprobarCantidad (struct producto vec[],int posicion, int venta)
{
    int aux;
    if (vec[posicion].cantidadDisponible >= venta)
        aux=1;
    else
        aux=2;
    return aux;
}
int mayorPrecio (struct producto vec[], int cant, int &contador)
{
    int i;
    int posicion;
    int mayor;
    contador=0;
    mayor=vec[0].precio;
    for (i=1;i<cant;i++)
    {
        if (vec[i].precio>mayor)
            mayor=i;
            contador=0;
        if (vec[i].precio==mayor)
            contador++;
    }
    cout<<endl<<endl<<contador<<endl<<endl;
    return mayor;
}
void noDisponibles (struct producto vec[], int cant)
{
    int i;
    cout<<endl<<endl<<"Productos no disponibles: ";
    cout<<endl;
    for (i=0;i<cant;i++)
    {
        if (vec[i].cantidadDisponible==0)
        {
            cout<<endl<<endl<<"Codigo: "<<vec[i].codigo;
            cout<<endl<<endl<<"Descripcion: "<<vec[i].descripcion;
            cout<<endl<<endl<<"Precio: "<<vec[i].precio;
            cout<<endl<<endl<<"Cantidad disponible: "<<vec[i].cantidadDisponible;
            cout<<endl<<endl<<endl;
        }
    }
    return;
}
void ordenarProductos (struct producto vec[] , int cant)
{
    int j,i,flag;
    string aux2;
    double aux;
    for (j=0; j<cant ; j++)
    {
        flag=1;
        for (i=0;i<(cant-1);i++)
        {
            if (vec[i].precio>vec[i+1].precio)
            {
                flag=0;
                aux2=vec[i].codigo;
                vec[i].codigo = vec[i+1].codigo;
                vec [i+1].codigo=aux2;
                aux2=vec[i].descripcion;
                vec[i].descripcion = vec[i+1].descripcion;
                vec [i+1].descripcion=aux2;
                aux=vec[i].precio;
                vec[i].precio = vec[i+1].precio;
                vec [i+1].precio=aux;
                aux=vec[i].cantidadDisponible;
                vec[i].cantidadDisponible = vec[i+1].cantidadDisponible;
                vec [i+1].cantidadDisponible=aux;
            }
        }
        if (flag==1)
            break;
    }
    return;
}
